# 小鸟角色脚本 - 实现跳跃和重力系统
extends CharacterBody2D

# 可以在Godot编辑器中调整这些参数
@export var jump_force: float = -300  # 跳跃力度（负值表示向上）
@export var gravity: float = 800      # 重力大小
@export var max_fall_speed: float = 400  # 最大下落速度

# 死亡效果参数
@export var death_fall_speed: float = 100  # 死亡时的初始下落速度

# 音效配置
@export_group("音效设置")
@export var jump_sound: AudioStream  # 跳跃音效
@export var death_sound: AudioStream  # 死亡音效
@export var sound_volume: float = 1.0  # 音效音量

# 旋转效果参数
@export var max_up_rotation: float = -30.0  # 最大上升旋转角度（度）
@export var max_down_rotation: float = 90.0  # 最大下落旋转角度（度）
@export var rotation_speed: float = 5.0  # 基础旋转速度（度/秒）
@export var max_rotation_speed: float = 15.0  # 最大旋转速度（度/秒）
@export var rotation_acceleration: float = 2.0  # 旋转加速度倍数

# 浮动动画参数
@export_group("浮动动画设置")
@export var floating_enabled: bool = true  # 是否启用浮动动画
@export var floating_speed: float = 2.0  # 浮动速度（周期/秒）
@export var floating_range: float = 20.0  # 浮动范围（像素）
@export var floating_offset: float = 0.0  # 浮动偏移量（像素）



# 小鸟动画状态
enum BirdState {MID, UP, DOWN}
var current_state: BirdState = BirdState.MID

# 小鸟的精灵节点
@onready var sprite: Sprite2D = $Sprite2D
@onready var animation_player: AnimationPlayer = $AnimationPlayer
# 音效播放器（可选）- 使用条件检查避免节点不存在错误
var audio_player: AudioStreamPlayer

# 小鸟图片资源
var midflap_texture: Texture2D
var upflap_texture: Texture2D
var downflap_texture: Texture2D

# 旋转相关变量
var target_rotation: float = 0.0  # 目标旋转角度
var current_rotation: float = 0.0  # 当前旋转角度

# 浮动动画相关变量
var floating_time: float = 0.0  # 浮动动画时间
var initial_y_position: float = 0.0  # 初始Y位置



# 小鸟的当前状态
var is_alive: bool = true
var is_dead: bool = false  # 新增：死亡状态
var has_jumped: bool = false  # 新增：是否已经跳跃过

func _ready():
	# 将小鸟添加到bird组中，便于管道检测
	add_to_group("bird")
	
	# 游戏开始时设置小鸟的初始位置
	position = Vector2(72, 256)
	
	# 记录初始Y位置用于浮动动画
	initial_y_position = position.y
	
	# 确保小鸟有碰撞检测
	if not has_node("CollisionShape2D"):
		print("警告：小鸟缺少碰撞形状，请添加CollisionShape2D节点")
	
	# 尝试获取音效播放器（如果存在的话）
	if has_node("AudioStreamPlayer"):
		audio_player = $AudioStreamPlayer
	
	# 加载小鸟图片资源
	load_bird_textures()
	
	# 设置初始状态
	update_bird_state(BirdState.MID)
	




func _physics_process(delta):
	# 始终更新小鸟旋转，不管状态如何
	update_bird_rotation(delta)
	
	# 更新浮动动画
	update_floating_animation(delta)
	

	
	# 检查游戏状态
	var game_manager = get_tree().get_first_node_in_group("game_manager")
	if game_manager:
		if game_manager.current_state == game_manager.GameState.MENU:
			# 菜单状态：小鸟保持静止，不受重力影响
			velocity = Vector2.ZERO
			return
		elif game_manager.current_state == game_manager.GameState.WAITING:
			# 等待状态：小鸟保持静止，不受重力影响
			velocity = Vector2.ZERO
			return
		elif game_manager.current_state == game_manager.GameState.PAUSED:
			# 暂停状态：小鸟保持静止
			velocity = Vector2.ZERO
			return
		elif game_manager.current_state == game_manager.GameState.PLAYING and not has_jumped:
			# 游戏进行中但未跳跃：小鸟保持静止
			velocity = Vector2.ZERO
			return
	
	if not is_alive and is_dead:
		# 死亡后的掉落效果
		velocity.y += gravity * delta
		
		# 移动小鸟
		move_and_slide()
		return
	
	if not is_alive:
		return
	
	# 应用重力 - 让小鸟下落（只在游戏进行中且已跳跃）
	velocity.y += gravity * delta
	
	# 限制最大下落速度
	if velocity.y > max_fall_speed:
		velocity.y = max_fall_speed
	
	# 根据速度方向更新小鸟状态
	update_bird_animation()
	
	# 移动小鸟
	move_and_slide()
	
	# 检查是否碰到地面（移除天花板碰撞检测）
	if is_on_floor():
		die()

func _input(event):
	# 当玩家按下跳跃键（空格）或点击鼠标时
	if event.is_action_pressed("jump") and is_alive:
		# 检查游戏状态
		var game_manager = get_tree().get_first_node_in_group("game_manager")
		if game_manager:
			if game_manager.current_state == game_manager.GameState.MENU:
				# 菜单状态下不能跳跃
				return
			elif game_manager.current_state == game_manager.GameState.PAUSED:
				# 暂停状态下不能跳跃
				return
		
		# 允许跳跃（在游戏进行中状态）
		jump()

func jump():
	# 检查游戏状态
	var game_manager = get_tree().get_first_node_in_group("game_manager")
	if game_manager:
		if game_manager.current_state == game_manager.GameState.MENU:
			print("在菜单状态下无法跳跃")
			return
		elif game_manager.current_state == game_manager.GameState.PAUSED:
			print("游戏已暂停，无法跳跃")
			return
	
	# 标记已经跳跃过
	has_jumped = true
	
	# 给小鸟一个向上的速度
	velocity.y = jump_force
	
	# 立即设置最大向上旋转角度
	current_rotation = max_up_rotation
	target_rotation = max_up_rotation
	if sprite:
		sprite.rotation_degrees = current_rotation
	
	# 更新小鸟状态为上升
	update_bird_state(BirdState.UP)
	
	# 播放跳跃动画（如果有的话）
	if animation_player and animation_player.has_animation("jump"):
		animation_player.play("jump")
	
	# 播放跳跃音效
	play_jump_sound()
	
	print("小鸟跳跃！")

func play_jump_sound():
	# 播放跳跃音效
	if jump_sound and audio_player:
		audio_player.stream = jump_sound
		audio_player.volume_db = linear_to_db(sound_volume)
		audio_player.play()
		print("播放跳跃音效")
	elif jump_sound:
		print("警告：跳跃音效已配置但缺少AudioStreamPlayer节点")
	elif audio_player:
		print("警告：AudioStreamPlayer节点存在但未配置跳跃音效")

func load_bird_textures():
	# 加载小鸟图片资源
	# 注意：如果文件不存在，会使用默认的黄色方块
	midflap_texture = load("res://assets/art/midflap.png")
	upflap_texture = load("res://assets/art/upflap.png")
	downflap_texture = load("res://assets/art/downflap.png")
	
	# 检查图片是否加载成功（静默处理，避免控制台警告）
	# if not midflap_texture:
	# 	print("警告：无法加载 midflap.png，使用默认图片")
	# if not upflap_texture:
	# 	print("警告：无法加载 upflap.png，使用默认图片")
	# if not downflap_texture:
	# 	print("警告：无法加载 downflap.png，使用默认图片")

func update_bird_state(new_state: BirdState):
	# 更新小鸟状态和图片
	current_state = new_state
	
	if sprite:
		match new_state:
			BirdState.MID:
				if midflap_texture:
					sprite.texture = midflap_texture
				else:
					sprite.modulate = Color(1, 1, 0, 1)  # 黄色
			BirdState.UP:
				if upflap_texture:
					sprite.texture = upflap_texture
				else:
					sprite.modulate = Color(0, 1, 0, 1)  # 绿色
			BirdState.DOWN:
				if downflap_texture:
					sprite.texture = downflap_texture
				else:
					sprite.modulate = Color(1, 0, 0, 1)  # 红色

func update_bird_animation():
	# 根据小鸟的速度方向自动更新动画状态
	if not is_alive:
		return
	
	# 根据Y轴速度决定小鸟状态
	if velocity.y < -50:  # 向上移动
		if current_state != BirdState.UP:
			update_bird_state(BirdState.UP)
	elif velocity.y > 50:  # 向下移动
		if current_state != BirdState.DOWN:
			update_bird_state(BirdState.DOWN)
	else:  # 接近静止状态
		if current_state != BirdState.MID:
			update_bird_state(BirdState.MID)
	
	# 更新目标旋转角度
	update_target_rotation()

func update_bird_rotation(delta: float):
	# 更新小鸟旋转
	if not is_alive:
		return
	
	# 计算旋转速度
	var rotation_diff = target_rotation - current_rotation
	var dynamic_speed = calculate_dynamic_rotation_speed(rotation_diff)
	
	# 应用旋转
	if abs(rotation_diff) > 0.1:
		var rotation_step = dynamic_speed * delta
		if rotation_diff > 0:
			current_rotation += min(rotation_step, rotation_diff)
		else:
			current_rotation -= min(rotation_step, -rotation_diff)
		
		if sprite:
			sprite.rotation_degrees = current_rotation

func update_floating_animation(delta):
	# 更新浮动动画
	if not floating_enabled or not is_alive or has_jumped:
		return
	
	# 检查游戏状态 - 在第一次跳跃前都应该有浮动动画
	var game_manager = get_tree().get_first_node_in_group("game_manager")
	if game_manager and game_manager.current_state == game_manager.GameState.PAUSED:
		return
	
	# 更新浮动时间
	floating_time += delta * floating_speed
	
	# 计算浮动位置（使用正弦波）
	var floating_y = sin(floating_time * PI * 2) * floating_range + floating_offset
	
	# 应用浮动位置
	position.y = initial_y_position + floating_y



func update_target_rotation():
	# 根据小鸟的状态更新目标旋转角度
	if not is_alive:
		# 死亡时保持已设置的目标角度
		return
	
	# 根据Y轴速度决定目标旋转角度
	if velocity.y < -50:  # 向上移动
		target_rotation = max_up_rotation
	elif velocity.y > 50:  # 向下移动
		target_rotation = max_down_rotation
	else:  # 接近静止状态
		target_rotation = 0.0

func calculate_dynamic_rotation_speed(rotation_diff: float) -> float:
	# 计算动态旋转速度
	# 角度差越大，速度越快；角度差越小，速度越慢
	
	# 计算旋转进度的百分比（0.0 到 1.0）
	var total_rotation_range = max_down_rotation - max_up_rotation
	var progress = 1.0 - (abs(rotation_diff) / total_rotation_range)
	progress = clamp(progress, 0.0, 1.0)  # 确保在0-1范围内
	
	# 使用缓动函数计算速度倍数
	# 开始时速度快，结束时速度慢
	var speed_multiplier = 1.0 + (rotation_acceleration * (1.0 - progress))
	
	# 计算最终速度
	var final_speed = rotation_speed * speed_multiplier
	
	# 限制最大速度
	final_speed = min(final_speed, max_rotation_speed)
	
	return final_speed



func die():
	# 防止重复调用
	if not is_alive:
		return
	
	# 小鸟死亡
	is_alive = false
	is_dead = true
	
	# 给小鸟一个向下的速度，开始掉落
	velocity.y = death_fall_speed
	
	# 设置死亡时的目标旋转角度（让旋转系统自动处理）
	target_rotation = max_down_rotation
	print("设置死亡目标旋转角度: ", target_rotation, " 当前角度: ", current_rotation)
	
	# 播放死亡动画（如果有的话）
	if animation_player and animation_player.has_animation("die"):
		animation_player.play("die")
	
	print("小鸟死亡了！开始掉落...")
	
	# 播放死亡音效
	play_death_sound()
	
	# 通知游戏管理器游戏结束
	get_tree().call_group("game_manager", "game_over")

func play_death_sound():
	# 播放死亡音效
	if death_sound and audio_player:
		audio_player.stream = death_sound
		audio_player.volume_db = linear_to_db(sound_volume)
		audio_player.play()
		print("播放死亡音效")
	elif death_sound:
		print("警告：死亡音效已配置但缺少AudioStreamPlayer节点")
	elif audio_player:
		print("警告：AudioStreamPlayer节点存在但未配置死亡音效")

# 碰撞检测信号处理
func _on_body_entered(body):
	# 当小鸟与管道碰撞时
	if body.is_in_group("pipes") and is_alive:
		print("小鸟碰到管道！")
		die()

func reset():
	# 重置小鸟状态
	is_alive = true
	is_dead = false
	has_jumped = false  # 重置跳跃标志
	velocity = Vector2.ZERO
	position = Vector2(72, 256)
	
	# 重置浮动动画
	floating_time = 0.0
	initial_y_position = position.y
	
	# 重置旋转
	current_rotation = 0.0
	target_rotation = 0.0
	if sprite:
		sprite.rotation_degrees = 0.0
	
	# 重置小鸟动画状态
	update_bird_state(BirdState.MID)
	
	# 重置动画（如果存在的话）
	if animation_player:
		animation_player.stop()
		# 只有在动画存在时才播放
		if animation_player.has_animation("idle"):
			animation_player.play("idle")
